Add a revealer to GtkInfoBar
authorMatthias Clasen <mclasen@redhat.com>
Wed, 31 Jul 2013 16:40:52 +0000 (18:40 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 3 Aug 2013 07:04:47 +0000 (09:04 +0200)
Make GtkInfoBar slide in and out as it is shown or hidden.

https://bugzilla.gnome.org/show_bug.cgi?id=704334

gtk/gtkinfobar.c
gtk/gtkinfobar.ui

index 776adc0930335d03acd9cefacb42668df88cb817..396a087d196077abe82da7573cc6ee709751bbbf 100644 (file)
@@ -41,6 +41,7 @@
 #include "gtkenums.h"
 #include "gtkbindings.h"
 #include "gtkdialog.h"
+#include "gtkrevealer.h"
 #include "gtkintl.h"
 #include "gtkprivate.h"
 #include "gtkorientable.h"
@@ -127,6 +128,7 @@ struct _GtkInfoBarPrivate
   GtkWidget *content_area;
   GtkWidget *action_area;
   GtkWidget *close_button;
+  GtkWidget *revealer;
 
   gboolean show_close_button;
   GtkMessageType message_type;
@@ -377,6 +379,36 @@ gtk_info_bar_draw (GtkWidget *widget,
   return FALSE;
 }
 
+static void
+gtk_info_bar_show (GtkWidget *widget)
+{
+  GtkInfoBarPrivate *priv = GTK_INFO_BAR (widget)->priv;
+
+  GTK_WIDGET_CLASS (gtk_info_bar_parent_class)->show (widget);
+
+  gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE);
+}
+
+static void
+child_revealed (GObject *object, GParamSpec *pspec, gpointer data)
+{
+  GtkWidget *widget = data;
+
+  GTK_WIDGET_CLASS (gtk_info_bar_parent_class)->hide (widget);
+  g_signal_handlers_disconnect_by_func (object, child_revealed, widget);
+  g_object_notify (G_OBJECT (widget), "visible");
+}
+
+static void
+gtk_info_bar_hide (GtkWidget *widget)
+{
+  GtkInfoBarPrivate *priv = GTK_INFO_BAR (widget)->priv;
+
+  gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), FALSE);
+  g_signal_connect_object (priv->revealer, "notify::child-revealed",
+                           G_CALLBACK (child_revealed), widget, 0);
+}
+
 static void
 gtk_info_bar_class_init (GtkInfoBarClass *klass)
 {
@@ -394,6 +426,8 @@ gtk_info_bar_class_init (GtkInfoBarClass *klass)
   widget_class->get_preferred_width = gtk_info_bar_get_preferred_width;
   widget_class->get_preferred_height = gtk_info_bar_get_preferred_height;
   widget_class->draw = gtk_info_bar_draw;
+  widget_class->show = gtk_info_bar_show;
+  widget_class->hide = gtk_info_bar_hide;
 
   klass->close = gtk_info_bar_close;
 
@@ -549,6 +583,7 @@ gtk_info_bar_class_init (GtkInfoBarClass *klass)
   gtk_widget_class_bind_template_child_internal_private (widget_class, GtkInfoBar, content_area);
   gtk_widget_class_bind_template_child_internal_private (widget_class, GtkInfoBar, action_area);
   gtk_widget_class_bind_template_child_internal_private (widget_class, GtkInfoBar, close_button);
+  gtk_widget_class_bind_template_child_internal_private (widget_class, GtkInfoBar, revealer);
 }
 
 static void
index 35e210762fa3875d424fbc64dec42e445751e3c0..b5823fa9b4250b53f86ba21cd44d4d41da951aab 100644 (file)
@@ -5,62 +5,76 @@
     <property name="app_paintable">True</property>
     <property name="can_focus">False</property>
     <child>
-      <object class="GtkBox" id="content_area">
+      <object class="GtkRevealer" id="revealer">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="border_width">8</property>
-        <property name="spacing">16</property>
         <child>
-          <placeholder/>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">True</property>
-        <property name="fill">True</property>
-        <property name="position">0</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkButtonBox" id="action_area">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="border_width">6</property>
-        <property name="orientation">horizontal</property>
-        <property name="spacing">6</property>
-        <property name="layout_style">end</property>
-        <child>
-          <placeholder/>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">1</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkButton" id="close_button">
-        <property name="visible">False</property>
-        <property name="can_focus">True</property>
-        <property name="border_width">6</property>
-        <property name="relief">none</property>
-        <style>
-          <class name="raised"/>
-          <class name="close"/>
-        </style>
-        <child>
-          <object class="GtkImage" id="close_image">
+          <object class="GtkBox" id="content">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="icon_name">window-close-symbolic</property>
+            <property name="border_width">0</property>
+            <property name="spacing">0</property>
+            <child>
+              <object class="GtkBox" id="content_area">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="border_width">8</property>
+                <property name="spacing">16</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButtonBox" id="action_area">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="border_width">6</property>
+                <property name="orientation">horizontal</property>
+                <property name="spacing">6</property>
+                <property name="layout_style">end</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="close_button">
+                <property name="visible">False</property>
+                <property name="can_focus">True</property>
+                <property name="border_width">6</property>
+                <property name="relief">none</property>
+                <style>
+                  <class name="raised"/>
+                 <class name="close"/>
+                </style>
+                <child>
+                  <object class="GtkImage" id="close_image">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="icon_name">window-close-symbolic</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
           </object>
         </child>
       </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">2</property>
-      </packing>
     </child>
   </template>
 </interface>